package 代码随想2._4字符串;

/**
 * @author XXX
 * @date 2024-01-16 22:16
 */

import java.util.Scanner;

/**
 * https://kamacoder.com/problempage.php?pid=1065
 *
 * 字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k，请编写一个函数，将字符串中的后面 k 个字符移到字符串的前面，实现字符串的右旋转操作。
 *
 * 例如，对于输入字符串 "abcdefg" 和整数 2，函数应该将其转换为 "fgabcde"。
 */
public class _5右旋字符串 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = Integer.parseInt(in.nextLine());
        String s = in.nextLine();

        int len = s.length();
        n = n % len;
        char[] strNum = s.toCharArray();

        //[a b c W X Y Z]
        //第一次逆转全部元素  [Z Y X W c b a]
        reverseString(strNum,0,len-1);
        //第二次只逆转开头n个 [X Y Z W c b a]
        reverseString(strNum, 0, n - 1);
        //第三次只逆转结尾len - n个  [W X Y a b c W]
        reverseString(strNum,n,len-1);

        System.out.println(strNum);

    }

    public static void reverseString(char[] ch, int start, int end) {
        //异或法反转字符串，参照题目 344.反转字符串的解释
        while (start < end) {
            ch[start] ^= ch[end];
            ch[end] ^= ch[start];
            ch[start] ^= ch[end];
            start++;
            end--;
        }
    }

    private void reverse(char[] s, int start, int end){
        while (start < end)
            swap(s,start++,end--);
    }
    //交换函数
    private void swap(char[] s, int a, int b){
        char temp = s[a];
        s[a] = s[b];
        s[b] = temp;
    }
}
